package cn.org.xwb.bookmall.user.service.impl;

import cn.org.xwb.bookmall.model.po.Manager;
import cn.org.xwb.bookmall.model.po.User;
import cn.org.xwb.bookmall.model.po.UserAllInfo;
import cn.org.xwb.bookmall.model.service.IUserService;
import cn.org.xwb.bookmall.model.service.impl.UserServiceImpl;
import cn.org.xwb.bookmall.model.utils.BookRedisUtil;
import cn.org.xwb.bookmall.model.utils.BookCodeUtil;
import cn.org.xwb.bookmall.model.vo.UserVo;
import cn.org.xwb.bookmall.user.service.LoginService;
import cn.org.xwb.common.encrypt.utils.SHAUtil;
import cn.org.xwb.common.model.vo.RespResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Objects;

@Service
public class LoginServiceImpl implements LoginService {

    @Autowired
    private BookRedisUtil bookRedisUtil;

    @Autowired
    private UserServiceImpl userService;

    @Autowired
    private BookCodeUtil bookCodeUtil;

    @Override
    public RespResult<Object> getMailCode(String mail) {
        // 获取账号信息
        UserAllInfo user = userService.findAndGenUserByMail(mail);
        // 判断是否有权可以登录
        // 无权登录
        if (Objects.isNull(user)) return RespResult.fail("抱歉，您暂时无权进行登录");
        // 判断是否可以再次获取
        // 不能再次获取
        if (Objects.nonNull(bookRedisUtil.getLoginMailCodeAgainUser(mail))) return RespResult.fail("请勿频繁获取验证码");
        // 发送验证码
        if (!bookCodeUtil.sendCodeLoginUser(mail)) return RespResult.fail("发送验证码失败");
        return RespResult.success("发送验证码成功");
    }

    /**
     * 通过邮箱登录
     *
     * @param mail
     * @param code
     * @return
     */
    @Override
    public RespResult<Object> loginByMail(String mail, String code) {
        // 判断是否有权登录
        // 根据邮箱查找用户，如果用户不存在则创建用户并返回
        UserAllInfo user = userService.findAndGenUserByMail(mail);
        // 无权登录
        if (Objects.isNull(user)) return RespResult.fail("抱歉，您暂时无权进行登录");
        // 查询验证码是否有效
        String code_cache = bookRedisUtil.getLoginMailCodeUser(mail);
        RespResult<Object> respResult = BookCodeUtil.judgeCode(code, code_cache);
        // 验证码失效或错误
        if (Objects.nonNull(respResult)) return respResult;
        // 有权登录，且验证码有效和正确
        // 缓存账号信息
        // 失败
        if (!bookRedisUtil.cacheUser(user)) return RespResult.fail("系统发生异常，请刷新页面或稍后重试");
        // 登录成功
        // 返回账号信息
        return RespResult.success("登录成功", new UserVo(user));
    }

    @Override
    public RespResult<Object> loginByPwd(String account, String pwd) {
        // 查询是否存在与用户输入的账号或用户名或电子邮箱对应的账号
        UserAllInfo userAllInfo = userService.getBaseMapper().selectUserAllInfoByAccount(account, account, account);
        // 不存在
        if (Objects.isNull(userAllInfo)) return RespResult.fail("账号或密码错误");
        if (userAllInfo.getDisabled()) return RespResult.fail("抱歉，您暂时无权进行登录");
        // 验证用户输入的密码是否正确
        Boolean verify = SHAUtil.encryptionVerifyBySHA256(pwd, userAllInfo.getSalt(), userAllInfo.getPassword());
        // 密码错误
        if (!verify) return RespResult.fail("账号或密码错误");
        // 缓存账号信息
        // 失败
        if (!bookRedisUtil.cacheUser(userAllInfo)) return RespResult.fail("系统发生异常，请刷新页面或稍后重试");
        // 登录成功
        // 返回账号信息
        return RespResult.success("登录成功", new UserVo(userAllInfo));
    }

    /**
     * 判断登录是否有效
     *
     * @param account
     * @return
     */
    @Override
    public RespResult<Object> effective(String account) {
        // 获取并刷新缓存
        UserAllInfo user = bookRedisUtil.getAndResetExpireUser(account);
        if (Objects.isNull(user)) return RespResult.fail("登录失效，请重新进行登录");
        return RespResult.success("登录有效");
    }

}
